home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / GMSMTH01.ZIP / INITSIGN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-08  |  8.5 KB  |  246 lines

  1. /* Initializes the ball(s) and adds them to the object list. */
  2. /* More of Mikes's code modified for the spinning sign demo */
  3.  
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <string.h>
  7.  
  8. #include <polygon.h>
  9.  
  10. #define NUM_BALLS 1              /* # of balls to initialize */
  11.  
  12. #include "sign.inc" /* face and vertex definitions for ball */
  13.  
  14. /* X, Y, Z rotations for balls, in tenths of degrees (angles) */
  15. static RotateControl InitialRotate[NUM_BALLS] = {
  16.    {0,64,0},};
  17.  
  18.  
  19. /* Shading types for faces of balls */
  20. static int FaceShadings[NUM_BALLS][NUM_FACES+10] = {
  21.    NO_SHADING,
  22.    TEXTURE_MAPPED_SHADING,
  23.    NO_SHADING,
  24.    TEXTURE_MAPPED_SHADING,
  25.    NO_SHADING,
  26.    NO_SHADING,
  27. //   TEXTURE_MAPPED_SHADING,
  28.    NO_SHADING,
  29.    NO_SHADING,
  30.    NO_SHADING,
  31.    NO_SHADING,
  32.    NO_SHADING,
  33. //   TEXTURE_MAPPED_SHADING,
  34.    NO_SHADING,
  35.    NO_SHADING,
  36.    NO_SHADING,
  37.    NO_SHADING,
  38.    NO_SHADING,
  39. };
  40.  
  41. /* Bear bitmap for texture mapping. Note: texture bitmaps must conform
  42.    to the pixel type of the destination; they are not device independent */
  43. char BearBits[] = {
  44.    60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
  45.    60,60,20,20,20,60,60,60,60,60,60,60,60,60,60,20,20,20,60,60,
  46.    60,20,20,20,20,20,60,60,60,60,60,60,60,60,20,20,20,20,20,60,
  47.    60,20,20,20,20,20,60,60,20,20,20,20,60,60,20,20,20,20,20,60,
  48.    60,20,20,20,20,20,60,20,20,20,20,20,20,60,20,20,20,20,20,60,
  49.    60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
  50.    60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
  51.    60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,
  52.    60,60,60,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,60,60,60,
  53.    60,60,20,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,20,60,60,
  54.    60,60,20,20,20,20, 3, 3, 3,20,20, 3, 3, 3,20,20,20,20,60,60,
  55.    60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
  56.    60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
  57.    60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
  58.    60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
  59.    60,20,20,20,20,20,20,20, 0, 0, 0, 0,20,20,20,20,20,20,20,60,
  60.    60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,
  61.    60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,
  62.    60,60,60,20,20,20,20,20,20,20,20,20,20,20,20,20,20,60,60,60,
  63.    60,60,60,60,60,20,20,20,20,20,20,20,20,20,20,60,60,60,60,60,
  64. };
  65.  
  66. /* Pattern bitmap for texture mapping. Note: texture bitmaps must conform
  67.    to the pixel type of the destination; they are not device independent. */
  68. char PatBits[] = {
  69.    12,12,12,12,12,12,12,12,12,
  70.    12,12, 3, 3, 3, 3,12,12,12,
  71.    12, 3,12,12,12,12, 3,12,12,
  72.    12,12, 3,12,12, 3,12,12,12,
  73.    12,12,12, 3, 3,12,12,12,12,
  74.    12,12,12,12,12,12,12,12,12,
  75. };
  76.  
  77. /* Descriptor for bear texture mapping bitmap */
  78. TextureMap BearTex = { 20, BearBits };
  79.  
  80. /* Descriptor for bear texture mapping bitmap */
  81. TextureMap PatTex = { 9, PatBits };
  82.  
  83. /* Vertices for first face's area of BearBits. Note that the texture bitmap
  84.    is set up with a boundary row column around it; this is so that if fixed-
  85.    point imprecision causes the source pointer to wander just off the
  86.    bitmap, appropriate pixels will be found (the boundary pixels are
  87.    duplicates of their neighbors) */
  88. Point BearVerts1[] = {
  89.    { 0, 0 }, {19, 0}, {19, 19}, {0, 19}
  90. };
  91.  
  92. /* Vertices for first face's area of PatBits */
  93. Point PatVerts1[] = {
  94.    { 0, 0 }, {4, 0}, {4, 5}, {0, 5}
  95. };
  96.  
  97. /* Vertices for second face's area of PatBits */
  98. Point PatVerts2[] = {
  99.    { 4, 0 }, {8, 0}, {8, 5}, {4, 5}
  100. };
  101.  
  102. typedef struct {
  103.    short FaceNumber;       /* index of face with the following texture */
  104.    TextureMap * TexMap; /* pointer to bitmap for texture mapping, if any */
  105.    Point * TexVerts; /* pointer to list of this polygon's vertices, in
  106.                         TextureMap coordinates. Index n must map to index
  107.                         n + 1 in VertNums, (the + 1 is to skip over the unit
  108.                         normal endpoint in VertNums) */
  109. } TexMap;
  110.  
  111. TexMap TexMaps[] = {
  112.    { 39, &PatTex,  PatVerts1 },
  113.    { 40, &PatTex,  PatVerts2 },
  114.    { 47, &BearTex, BearVerts1 },
  115. };
  116.  
  117. #define NUM_TEX_MAPS (sizeof(TexMaps)/sizeof(TexMap))
  118.  
  119. /* Starting coordinates for balls in world space */
  120. static int BallStartCoords[11][3] = {
  121.    {0,   0,-300},
  122.    {50,  0,-290},
  123.    {-50,0,-290},
  124.    {-150,0,-390},
  125.    {-500,0,-490},
  126.    {0,   0,-590},
  127.    {50 , 0,-690},
  128.    {500, 0,-790},
  129.    {500, 0,-890},
  130.    {100, 0,-990},
  131.    {-100, 0,-990}
  132. };
  133. /* Delay counts (speed control) for balls */
  134. static int InitRDelayCounts[NUM_BALLS] = {1};
  135. static int BaseRDelayCounts[NUM_BALLS] = {1};
  136. static int InitMDelayCounts[NUM_BALLS] = {1};
  137. static int BaseMDelayCounts[NUM_BALLS] = {1};
  138.  
  139. void InitializeBalls(unsigned char far *shape)
  140. {
  141. int i, j, k, TexMapFound, colorInd=17;
  142. PObject *WorkingBall;
  143. Point *pp;
  144.  
  145.    _fmemcpy(&i, shape, 2);
  146.    _fmemcpy(&j, shape+2, 2);
  147.    TexMaps[2].TexMap->TexMapBits=shape+4;
  148.    TexMaps[2].TexMap->TexMapWidth=i;
  149.    pp=TexMaps[2].TexVerts;
  150.    pp->X=0;
  151.    pp->X=0;
  152.    pp++;
  153.    pp->X=i;
  154.    pp->Y=0;
  155.    pp++;
  156.    pp->X=i;
  157.    pp->Y=j-1;
  158.    pp++;
  159.    pp->X=0;
  160.    pp->Y=j-1;
  161.  
  162.    for (i=0; i<NUM_BALLS; i++) {
  163.       if ((WorkingBall = malloc(sizeof(PObject))) == NULL)
  164.          {
  165.          die("Couldn't get memory");
  166.          }
  167.       // WorkingBall->DrawFunc = DrawPObject;
  168.       // WorkingBall->RecalcFunc = XformAndProjectPObject;
  169.       // WorkingBall->MoveFunc = RotateAndMoveBall;
  170.       WorkingBall->RecalcXform = 1;
  171.       WorkingBall->not_draw = 1;
  172.       WorkingBall->RDelayCount = InitRDelayCounts[0];
  173.       WorkingBall->RDelayCountBase = BaseRDelayCounts[0];
  174.       WorkingBall->MDelayCount = InitMDelayCounts[0];
  175.       WorkingBall->MDelayCountBase = BaseMDelayCounts[0];
  176.       /* Set the object->world xform to none */
  177.       for (j=0; j<3; j++)
  178.          for (k=0; k<4; k++)
  179.             WorkingBall->XformToWorld[j][k] = INT_TO_FIXED(0);
  180.       WorkingBall->XformToWorld[0][0] =
  181.          WorkingBall->XformToWorld[1][1] =
  182.          WorkingBall->XformToWorld[2][2] = INT_TO_FIXED(1);
  183.       /* Set the initial location */
  184.       for (j=0; j<3; j++) {
  185.           WorkingBall->XformToWorld[j][3] =
  186.                 INT_TO_FIXED(BallStartCoords[i][j]);
  187.       }
  188.       /* Initial center coordinates */
  189.       WorkingBall->CenterInView.X = WorkingBall->XformToWorld[0][3];
  190.       WorkingBall->CenterInView.Y = WorkingBall->XformToWorld[1][3];
  191.       WorkingBall->CenterInView.Z = WorkingBall->XformToWorld[2][3];
  192.       WorkingBall->NumVerts = NUM_VERTS;
  193.       WorkingBall->NumRealVerts = NUM_REAL_VERTS;
  194.       WorkingBall->VertexList = Verts;
  195.       WorkingBall->NumFaces = NUM_FACES;
  196.       WorkingBall->Rotate = InitialRotate[0];
  197.       if ((WorkingBall->XformedVertexList =
  198.             malloc(NUM_VERTS*sizeof(Point3))) == NULL)
  199.          {
  200.          die("1 no mem");;
  201.          }
  202.       if ((WorkingBall->ProjectedVertexList =
  203.             malloc(NUM_VERTS*sizeof(Point3))) == NULL) {
  204.          die("2 no mem"); }
  205.       if ((WorkingBall->ScreenVertexList =
  206.             malloc(NUM_VERTS*sizeof(Point))) == NULL) {
  207.          die("3 no mem"); }
  208.       if ((WorkingBall->FaceList =
  209.             malloc(NUM_FACES*sizeof(Face))) == NULL) {
  210.          die("4 no mem"); }
  211.       /* Initialize the faces */
  212.       for (j=0; j<NUM_FACES; j++) {
  213.          WorkingBall->FaceList[j].VertNums = VertNumList[j];
  214.          WorkingBall->FaceList[j].NumVerts = VertsInFace[j];
  215.          WorkingBall->FaceList[j].ShadingType = FaceShadings[0][j];
  216. //       WorkingBall->FaceList[j].ShadingType = TEXTURE_MAPPED_SHADING;
  217.          if (WorkingBall->FaceList[j].ShadingType == NO_SHADING) {
  218.            { /* If no shading is in effect, convert the color from the model
  219.                color to a color index, which we can then use directly */
  220.             WorkingBall->FaceList[j].ColorIndex = 15;
  221.            }
  222.          } else if (WorkingBall->FaceList[j].ShadingType ==
  223.                TEXTURE_MAPPED_SHADING) {
  224.  
  225.             /* Search TexMaps for this face's texture mapping info */
  226.             TexMapFound = 0;
  227.             for (k=0; (k<NUM_TEX_MAPS) && !TexMapFound; k++) {
  228.                if ( k == 2 ) {
  229.                //if (TexMaps[k].FaceNumber == j) {
  230.                   WorkingBall->FaceList[j].TexMap = TexMaps[k].TexMap;
  231.                   WorkingBall->FaceList[j].TexVerts = TexMaps[k].TexVerts;
  232.                   TexMapFound = 1;
  233.                }
  234.             }
  235.  
  236.             if (!TexMapFound) {
  237.                die("tex map not found");;
  238.             }
  239.  
  240.          }
  241.       }
  242.       AddObject((Object *)WorkingBall);
  243.    }
  244. }
  245. 
  246.